《Android开源库》 Google 最新Hover Menu(悬浮菜单)

简介

Hover,这些天大家讨论的比较多的一个开源库,google组织下的一个项目,但是项目介绍中又出现了

这里写图片描述

Why ?

官网Demo

这里写图片描述

简单使用

  1. 自定义MyNavigationContent,用来显示每个不同的Tab下的内容页
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class MyNavigationContent extends FrameLayout implements NavigatorContent {
private ImageView imageViewLogo;
private TextView textViewTitle;
private int imageResId;
private String title;

public MyNavigationContent(@NonNull Context context, int imageRedId, String title) {
super(context);
this.imageResId = imageRedId;
this.title = title;
init();
}

private void init() {
LayoutInflater.from(getContext()).inflate(R.layout.view_content_text_icon, this, true);
imageViewLogo = (ImageView) findViewById(R.id.iv_logo);
textViewTitle = (TextView) findViewById(R.id.tv_title);
imageViewLogo.setImageResource(imageResId);
textViewTitle.setText(title);
}

@NonNull
@Override
public View getView() {
return this;
}

@Override
public void onShown(@NonNull Navigator navigator) {
}

@Override
public void onHidden() {
}
}

2.自定义HoverMenuAdapter,用于将tab和NavigationContent联系起来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
public class HoverDemoMenuAdapter implements HoverMenuAdapter {

private final Context mContext;
private final List<String> mTabIds;
private final Map<String, NavigatorContent> mData;
private final Set<ContentChangeListener> mContentChangeListeners = new HashSet<>();

public HoverDemoMenuAdapter(@NonNull Context context, @NonNull Map<String, NavigatorContent> data) throws IOException {
mContext = context;
mData = data;

mTabIds = new ArrayList<>();
for (String tabId : mData.keySet()) {
mTabIds.add(tabId);
}
}

@Override
public int getTabCount() {
return mTabIds.size();
}

@Override
public View getTabView(int index) {
ImageView imageView = new ImageView(mContext);
imageView.setBackgroundResource(R.drawable.bg);
switch (index) {
case 0: imageView.setImageResource(R.drawable.bike);break;
case 1: imageView.setImageResource(R.drawable.run);break;
case 2: imageView.setImageResource(R.drawable.android);break;
default:break;
}
imageView.setPadding(30,30,30,30);

return imageView;
}

@Override
public long getTabId(int position) {
return position;
}

@Override
public NavigatorContent getNavigatorContent(int index) {
String tabId = mTabIds.get(index);
return mData.get(tabId);
}

@Override
public void addContentChangeListener(@NonNull ContentChangeListener listener) {
mContentChangeListeners.add(listener);
}

@Override
public void removeContentChangeListener(@NonNull ContentChangeListener listener) {
mContentChangeListeners.remove(listener);
}
}

3.创建继承HoverMenuService的自定义Service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public class HoverDemoService extends HoverMenuService {

private HoverDemoMenuAdapter mDemoHoverMenuAdapter;

/*显示悬浮按钮*/
public static void showFloatingMenu(Context context) {
context.startService(new Intent(context, HoverDemoService.class));
}

@Override
protected HoverMenuAdapter createHoverMenuAdapter() {
try {
Map<String, NavigatorContent> data = new HashMap<>();
/*添加tab和对应的NavigationContent*/
data.put("1", new MyNavigationContent(this, R.drawable.bike, "1,自行车是克服心脏功能毛病的最佳工具之一。世界上有半数以上的人是死于心脏病的,骑单车不只能藉腿部的运动压缩血液流动,以及把备注从血管末梢抽回心脏,事实上却同时强化了微血管组织,这叫“附带循环”。强化血管可以使你不受年龄的威胁,青春永驻。 \n" +
"2,习惯性的单车运动,更能扩大你的心脏。否则血管愈来愈细,心脏愈来愈退化,到了晚年,你就会体验到它所带来的烦恼,那时你会发现,自行车运动是多么的完美。单车是需要大量氧气的运动,曾经有个老年人以6天时间,完成了460公里的单车旅行。他说:“老年人一周至少要有3次运动,使心脏强化起来,恢复正常功能。你要使心脏激烈跳动,但不可过久。如此它将能适应紧急状况,如赶车或抵抗困境。”\n" +
"3,单车运动同时也能防止高血压,有时比药物更有效。还能防止发胖、血管硬化,并使骨骼强半。自行车使你不必用药物来维持健康,而且毫无害处。"));
data.put("2", new MyNavigationContent(this,R.drawable.run, "1.告别臃肿身材。\n" +
"\n" +
"许多人开始跑步就是因为减肥,跑步确实减肥的最好运动方式,跑步每分钟比起其他运动燃烧更多的卡路里。\n" +
"\n" +
"2.防止你的骨骼,肌肉退化。\n" +
"\n" +
"我们的骨骼是和你的身体需求相互协调的。长期坐在显示器前的我们让我们的骨骼越来越脆弱。而长期的,经常的运动会使你的骨骼保持健康。更进一步说就是防止我们身体内部老化的更快。经常的高强度锻炼,例如跑步,被证明可以促进人体荷尔蒙的生长,荷尔蒙就是那些名人为了看起来更年轻而持续注射的药剂。\n" +
"\n" +
"3.抵抗疾病\n" +
"\n" +
"跑步可以降低得中风和乳腺癌的风险。经常的跑步已经成为医生对那些容易引发或在已经处在早期的骨质疏松,糖尿病,高血压病人的治疗建议。\n" +
"\n" +
"4.维持并提高总体的身体水平。\n" +
"\n" +
"跑步是是人们可以采取的最好的锻炼身体的运动。它可以提高胆固醇,降低血液凝块的危险,锻炼你的50%的经常处于闲置状态的肺。跑步还可以通过增加你的淋巴细胞来增强你的免疫力。\n" +
"\n" ));
data.put("3", new MyNavigationContent(this,R.drawable.android,"Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用“安卓”或“安致”。Android操作系统最初由Andy Rubin开发,主要支持手机。2005年8月由Google收购注资。2007年11月,Google与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。随后Google以Apache开源许可证的授权方式,发布了Android的源代码。第一部Android智能手机发布于2008年10月。Android逐渐扩展到平板电脑及其他领域上,如电视、数码相机、游戏机等。2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。 2013年的第四季度,Android平台手机的全球市场份额已经达到78.1%。[1] 2013年09月24日谷歌开发的操作系统Android在迎来了5岁生日,全世界采用这款系统的设备数量已经达到10亿台。"));

/*创建Adapter*/
mDemoHoverMenuAdapter = new HoverDemoMenuAdapter(this, data);
return mDemoHoverMenuAdapter;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}

4.入口Activity中设置一个点击事件显示悬浮框

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class DeActivity extends AppCompatActivity {

Button btShow;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_de);

btShow = (Button)findViewById(R.id.bt_show);
btShow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
HoverDemoService.showFloatingMenu(DeActivity.this);
}
});
}
}

实际效果

这里写图片描述

写在最后

博文内容基于如下版本

1
compile 'io.mattcarroll.hover:hover:0.9.6'

个人创建类的方式和Github上推荐的使用方式是相反的,依据个人习惯使用即可。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×